package com.zjitc.rj1601;

import java.lang.reflect.Constructor;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;

public class Reflect01 {

  public static void main(String[] args) {

    // 以后还会遇到非常多的库
    // 在这些库中的类肯定是没有见过的，而且名字极其变态
    // 1. 类是做什么的
    // 2. 类中的方法提供了什么功能
    // 直接调用即可
    // Class.forName, 寻找项目中或者依赖包中是否有Person.class
    try {

      // 获取类的描述
      Class r = Reflect01.class;

      // 动态的加载一个Person类，此时，你完全不知道Person类中的所有方法以及字段的信息
      Class<?> cs = Class.forName("com.zjitc.rj1601.Person");

      // 获取Class中的所有构造函数
      // 1. cs.getConstructors();   返回值是：该类型的所有构造函数
      // 2. [] : 数组
      // 3. Constructor<?>
      Constructor<?>[] constructors = cs.getConstructors();

      // 通过没有参数的构造函数生成一个对象
      // new Person();
      Object o = constructors[0].newInstance();
      System.out.println(o);

      // 调用其有参数的构造函数
      // new Person(11, "wch");
      Object wch = constructors[1].newInstance(11, "wch");
      System.out.println(wch);

      // 获取类中的所有方法
      System.out.println("Person类中的所有方法");

      // 1. []
      // 2. Method
      Method[] methods = cs.getMethods();
      for (int i = 0; i < methods.length; i++) {

        String name = methods[i].getName();
        System.out.println(name);

        if (name.equals("getName")) {
          // 此时 找到了getName的方法
          Method m = methods[i];

          System.out.println("调用wch对象的getName方法" + m.invoke(wch));
          System.out.println("调用o对象的getName方法" + m.invoke(o));
        }
      }
    } catch (ClassNotFoundException e) {
      e.printStackTrace();
    } catch (IllegalAccessException e) {
      e.printStackTrace();
    } catch (InstantiationException e) {
      e.printStackTrace();
    } catch (InvocationTargetException e) {
      e.printStackTrace();
    }
  }
}
